package 力扣题库;

public class p463岛屿的周长 {

    public int islandPerimeter(int[][] grid) {
        //回溯算法
        int r=grid.length;    //行数
        int c=grid[0].length; //列数
        for (int i = 0; i <r ; i++) {
            for (int j = 0; j <c; j++) {
                if (grid[i][j]==1){
                    //当前网格是岛屿，开始递归，求岛屿周长
                    return dfs(grid,i,j);
                }
            }
        }
        return 0;
    }

    private int dfs(int[][] grid, int r, int c) {
        if ( !(r>=0 && r<grid.length && c>=0 && c<grid[0].length)) {
            //网格位于边界时，返回 1周长
            return 1;
        }

        if (grid[r][c]==0) {
            //当前网格是水域，返回 1周长
            return 1;
        }

        if (grid[r][c]==2) {
            //当前网格是岛屿，但是已经走过了
            return 0;
        }

        grid[r][c]=2;//当前网格是岛屿，且没有走过
        return dfs(grid,r-1,c)+dfs(grid,r+1,c)+dfs(grid,r,c-1)+dfs(grid,r,c+1);
    }
}
